package com.example.demo.common;
import org.springframework.util.DigestUtils;
import org.springframework.util.StringUtils;

import javax.lang.model.element.NestingKind;
import java.nio.charset.StandardCharsets;
import java.util.UUID;
/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: WHY
 * Date: 2023-09-20
 * Time: 9:15
 */

/**
 * 密码工具类
 */
public class PasswordUtils {
    //加密
    public static String encrypt(String password){
        //1.盐值
        String salt= UUID.randomUUID().toString().replace("-","");
        //2.将盐值+密码进行md5加密得到最终密码,(md5加密是不可逆的,只能加密,不能解密)
        String finalPassword=DigestUtils.md5DigestAsHex((salt+password).getBytes(StandardCharsets.UTF_8));

        //3.将盐值和最终密码返回
        return salt+"$"+finalPassword;


    }

    /**
     * 加盐验证
     * @param password 待验证密码
     * @param dbPassword 数据库的密码=盐值+分隔符+最终密码
     * @return
     */

    public static boolean decrypt(String password,String dbPassword){
        if(!StringUtils.hasLength(password)||!StringUtils.hasLength(dbPassword)||
        dbPassword.length()!=65){
            return false;
        }

        //1.得到盐值
        String[] dbPasswordArray=dbPassword.split("\\$");
        if(dbPasswordArray.length!=2){
            return false;
        }
        //盐值
        String salt=dbPasswordArray[0];
        //最终正确密码
        String dbFinalPassword=dbPasswordArray[1];
        //2.加密待验证的密码
        String finalPassword=DigestUtils.md5DigestAsHex((salt+password).getBytes(StandardCharsets.UTF_8));
        //3.对比
        if(finalPassword.equals(dbFinalPassword)){

            return true;
        }
        return false;
    }

    //解密
    //1.有一个待验证密码
    //2.最终存储到数据库的盐值和最终密码
    //使用待验证的密码和盐值进行同轨迹的加密,最后和最终密码比较
    //1.得到数据库的盐值
    //2.md5(盐值+待验证密码)->最终待验证密码
    //3.对比最终待验证密码和数据库中的最终密码是否相同->相同密码正确



}
